package com.cyyl.updater

import android.app.DownloadManager
import com.cyyl.updater.browser.BrowserUpdate
import com.cyyl.updater.download.DownloadUpdate
import com.cyyl.updater.market.MarketUpdate
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow

/**
 * Created on 2019/12/23
 * Title:
 * Description:
 *
 * @author Android-张康
 */
class AppUpdater internal constructor(private val appUpdaterBuilder: AppUpdaterBuilder) {

    companion object {
        /**
         * 应用市场更新
         */
        const val UPDATE_TYPE_MARKET = 0

        /**
         * 浏览器更新
         */
        const val UPDATE_TYPE_BROWSER = 1

        /**
         * 内部更新
         */
        const val UPDATE_TYPE_INTERNAL = 2

        /**
         * 所有浏览器
         */
        private const val BROWSER_TYPE_ALL = BrowserUpdate.BROWSER_TYPE_ALL

        /**
         * 默认浏览器
         */
        const val BROWSER_TYPE_DEFAULT = BrowserUpdate.BROWSER_TYPE_DEFAULT

        /**
         * 系统浏览器
         */
        private const val BROWSER_TYPE_SYSTEM = BrowserUpdate.BROWSER_TYPE_SYSTEM

        /**
         * UC浏览器
         */
        const val BROWSER_TYPE_UC = BrowserUpdate.BROWSER_TYPE_UC

        /**
         * 腾讯QQ浏览器
         */
        const val BROWSER_TYPE_TENCENT = BrowserUpdate.BROWSER_TYPE_TENCENT

        /**
         * 谷歌浏览器
         */
        const val BROWSER_TYPE_CHROME = BrowserUpdate.BROWSER_TYPE_CHROME

        /**
         * 下载状态 下载中
         */
        const val DOWNLOAD_STATUS_RUNNING = DownloadManager.STATUS_RUNNING

        /**
         * 下载状态 下载成功
         */
        const val DOWNLOAD_STATUS_SUCCESSFUL = DownloadManager.STATUS_SUCCESSFUL

        /**
         * 下载状态 下载失败
         */
        const val DOWNLOAD_STATUS_FAILED = DownloadManager.STATUS_FAILED

        /**
         * 接收下载状态
         * [Triple.first] 下载状态
         * [Triple.second] 下载进度
         * [Triple.third] 错误信息
         */
        var lastDownloadFlow: Flow<Triple<Int, Int, String?>>? = null
            internal set

        lateinit var authority: String
    }

    /**
     * 更新
     *
     * @return true 表示提交成功，false 表示提交失败
     */
    fun update(): Boolean {
        return when (appUpdaterBuilder.getUpdateType()) {
            UPDATE_TYPE_MARKET -> {
                MarketUpdate.updateByMarket(appUpdaterBuilder)
            }
            UPDATE_TYPE_BROWSER -> {
                BrowserUpdate.updateByBrowser(appUpdaterBuilder)
            }
            UPDATE_TYPE_INTERNAL -> {
                DownloadUpdate.updateByInternal(appUpdaterBuilder)
            }
            else -> {
                false
            }
        }
    }

    /**
     * 获取下载进度的Flow
     */
    fun getProgressFlow(): MutableStateFlow<Triple<Int, Int, String?>> {
        lastDownloadFlow = appUpdaterBuilder.downloadProgressFlow
        return appUpdaterBuilder.downloadProgressFlow
    }

}